#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "mitar.h"

extern char *uso;


int copynFile(FILE *origen, FILE *destimo, int nBytes);
int readHeader(FILE *tarFile, stHeaderEntry **header, int *nFiles);


int createTar(int nFiles, char *fileNames[], char tarName[]) {
  
  int i;
  FILE *tarFile, *inputFile;
  stHeaderEntry *header;
  
  //fichero[s]
  if(nFiles<=0) {
    fprintf(stderr, uso);
    return(EXIT_FAILURE);
  }

  //Abrimos el fichero destino
  tarFile=fopen(tarName,"w");
  //Reservamos memoria para la estructura cabecera del mtar
  header=(stHeaderEntry*)malloc(sizeof(stHeaderEntry)*nFiles);
  
  //Nos posicionamos enla zona de datos del fichero mtar
  fseek(tarFile,sizeof(int)+sizeof(header),SEEK_SET);

  //Relleno la cabecera en RAM y copio los datos de los ficheros en el tar
  for(i=0; i<nFiles; i++) {
    //Abrimos fichero fuente
	inputFile=fopen(fileNames[i],"r");
	fseek(inputFile,0,SEEK_END);

    //Completamos la cabecera en memoria (NO en el fichero)
	strcpy(header[i].name,fileNames[i]);
	header[i].size=ftell(inputFile);
	
    //Copiamos el fichero origen al fichero TAR
	copynFile(inputFile,tarFile,1);

  }

  // Escribimos al fichero la cabecera (num. ficheros y lo que hemos ido creando en memoria)
  fseek(tarFile,0,SEEK_SET);
  fwrite(&nFiles,sizeof(int),1,tarFile);
  fwrite(header,sizeof(stHeaderEntry),nFiles,tarFile);

  
  return(EXIT_SUCCESS);
}

int extractTar(char tarName[]) {
  stHeaderEntry *header;
  int nFiles,i;
  FILE *tarFile,*outputFile;
  
  //Abrimos el tarball
  
  //Leemos la cabecera del mtar, utilizando la funci�n readHeader

  //Creamos los ficheros contenidos en el mtar. Para ello recorremos secuencialmente la cabecera,
  // creando (abriendo en escritura) los ficheros indicados en cada uno de los descriptores y copiando
  // en ellos su contenido, que se leer� del tarball usando la funci�n copynFile.
  
  //Liberamos memoria de la cabecera y cerramos el tarball

 
  return(EXIT_SUCCESS);
}
  
int copynFile(FILE *origen, FILE *destimo, int nBytes){
  int nCopy=0;
  char c;

  // Copiar todo el contenido del fichero origen, byte a byte, al destino.
  // Devolvemos en nCopy los bytes copiados.
  fseek(origen,0,SEEK_SET);

  while(!feof(origen)){
	  fread(&c,1,1,origen);
	  fwrite(&c,1,1,destimo);
	  nCopy++;
  }

  return(nCopy);
}

int readHeader(FILE *tarFile, stHeaderEntry **header, int *nFiles){

  //Primero leemos el n�mero de ficheros contenidos en el tarball
  
  //Reservamos memoria del heap para la cabecera del tarball
  
  //Leemos toda la cabecera

  return(EXIT_SUCCESS);
}
